package org.robert.export_client.excel.impl;

import org.apache.commons.lang3.StringUtils;
import org.robert.export_client.excel.metadata.ComparisonEnum;
import org.robert.export_client.excel.metadata.DependEntity;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;

/**
 * ExcelDependService: 数据依赖判断，可以使用策略模式，没必要
 * @author zhaoshengtao
 * @date 2024/02/01
 */
public class ExcelDependService {

    private static final List<Class<?>> NUMBER_CLASS_LIST = new ArrayList<>();

    static {
        NUMBER_CLASS_LIST.add(Integer.class);
        NUMBER_CLASS_LIST.add(int.class);
        NUMBER_CLASS_LIST.add(Double.class);
        NUMBER_CLASS_LIST.add(double.class);
        NUMBER_CLASS_LIST.add(Float.class);
        NUMBER_CLASS_LIST.add(float.class);
        NUMBER_CLASS_LIST.add(Short.class);
        NUMBER_CLASS_LIST.add(short.class);
        NUMBER_CLASS_LIST.add(Long.class);
        NUMBER_CLASS_LIST.add(long.class);
        NUMBER_CLASS_LIST.add(BigDecimal.class);
    }

    public static boolean checkDependValue(DependEntity dependEntity, String fieldValue){
        if(dependEntity == null){
            return false;
        }
        ComparisonEnum dependType = dependEntity.getDependType();
        if (dependType.getValue() == 13){
            return true;
        }
        String maxValue = dependEntity.getDependValue();
        // 解析类型
        Class<?> valueClazz = dependEntity.getValueClazz();
        // 如果是数字类型，就使用bigDecimal比较
        if(NUMBER_CLASS_LIST.contains(valueClazz)){
            BigDecimal fieldDecimal = new BigDecimal(fieldValue);
            BigDecimal maxDecimal = new BigDecimal(String.valueOf(maxValue));
            if(dependType.getValue() == 1){
                // 等于
                return fieldDecimal.compareTo(maxDecimal) == 0;
            }else if (dependType.getValue() == 2){
                // 不等于
                return fieldDecimal.compareTo(maxDecimal) != 0;
            }else if (dependType.getValue() == 3){
                // 大于
                return fieldDecimal.compareTo(maxDecimal) > 0;
            }else if (dependType.getValue() == 4){
                // 小于
                return fieldDecimal.compareTo(maxDecimal) < 0;
            }else if (dependType.getValue() == 5){
                // 大于等于
                return fieldDecimal.compareTo(maxDecimal) > 0 || fieldDecimal.compareTo(maxDecimal) == 0;
            }else {
                boolean b = fieldDecimal.compareTo(maxDecimal) < 0 || fieldDecimal.compareTo(maxDecimal) == 0;
                if (dependType.getValue() == 6){
                    // 小于等于
                    return b;
                }else if (dependType.getValue() == 7){
                    // 包含
                    BigDecimal minDecimal = new BigDecimal(dependEntity.getDependMinValue());
                    return (fieldDecimal.compareTo(minDecimal) > 0 || fieldDecimal.compareTo(minDecimal) == 0)
                            && (b);

                }else if (dependType.getValue() == 8){
                    // 不包含
                    BigDecimal minDecimal = new BigDecimal(dependEntity.getDependMinValue());
                    return fieldDecimal.compareTo(minDecimal) < 0
                            || fieldDecimal.compareTo(maxDecimal) > 0;
                }
            }

        }else{
            if(dependType.getValue() == 1){
                return fieldValue.equals(maxValue);
            }else if (dependType.getValue() == 2){
                // 不等于
                return !fieldValue.equals(maxValue);
            }else if (dependType.getValue() == 7){
                return maxValue.contains(fieldValue);
            }else if (dependType.getValue() == 8){
                return !maxValue.contains(fieldValue);
            }else if (dependType.getValue() == 9){
                return fieldValue != null;
            }else if (dependType.getValue() == 10){
                return fieldValue == null;
            }else if (dependType.getValue() == 11){
                return StringUtils.isNotBlank(fieldValue);
            }else if (dependType.getValue() == 12){
                return StringUtils.isBlank(fieldValue);
            }
        }

        return false;
    }

    private Object convertedObject (Class<?> clazz, Object value){
        if (clazz.isInstance(value)) {
            // 安全转型为目标类型
            return clazz.cast(value);
        } else {
            throw new IllegalArgumentException("Cannot cast object to " + clazz.getName());
        }
    }

}
